#include "stdio.h"
#include "stdlib.h"

#include "Element.h"
#include "SeqStack.h"

/**
 * 初始化栈
 * @param seqStack
 */
void InitSeqStack(SeqStack *seqStack) {
    /* 顺序栈的栈顶元素指向 -1,说明为空栈 */
    seqStack->top = -1;
    /* 初始化顺序栈的长度为 0 */
    seqStack->length = 0;
}


/**
 * 顺序栈的入栈(压栈)操作
 * @param seqStack 要操作的顺序栈
 * @param element 插入的元素
 * @return 返回 TRUE(1) | FALSE(0)
 */
int PushSeqStack(SeqStack *seqStack, ElementType element) {
    /* 入栈时: 判断栈是否满了 */
    if (seqStack->top == MAX_SIZE - 1) {
        printf("栈满,压栈操作失败!");
        return FALSE;
    }
    /* 栈顶指针+1,以便于加入新的元素 */
    seqStack->top++;
    /* 将新插入的元素赋值给栈顶 */
    seqStack->elem[seqStack->top] = element;
    /* 顺序栈的长度自增 */
    seqStack->length++;

    return TRUE;
}


/**
 * 顺序栈出栈操作
 * @param seqStack  要操作的顺序栈
 * @param element  操作的顺序栈元素
 * @return  以指针方式返回出栈的元素,返回值为出栈的结果 TRUE(1) | FALSE(0)
 */
int PopSeqStack(SeqStack *seqStack, ElementType *element) {
    /* 出栈时: 先判断是否为空,没有元素就不能进行出栈操作 */
    if (seqStack->top == -1) {
        printf("空栈,出栈失败!");
        return FALSE;
    }

    /* 返回指向栈顶的元素 */
    *element = seqStack->elem[seqStack->top];
    seqStack->top--;
    seqStack->length--;
    return TRUE;
}

/**
 * 清空栈
 * @param seqStack
 */
void ClearSeqStack(SeqStack *seqStack) {
    seqStack->top = -1;
    seqStack->length = 0;
}


/**
 * 获取栈顶元素
 * @param seqStack
 * @param element
 */
void GetSeqStackTopElement(SeqStack *seqStack, ElementType *element) {
    /* 判断是否为空栈 */
    if (seqStack->top == -1) {
        printf("空栈,栈顶元素为空!");
        element = NULL;
        return;
    }
    /* 获取栈顶元素 */
    *element = seqStack->elem[seqStack->top];
}


/* 栈是否为空 */
int IsEmptySeqStack(SeqStack *seqStack) {
    return seqStack->top == -1 ? TRUE : FALSE;
}